package com.woniuxy.controller;

import com.woniuxy.entity.DTO.algorithm.ProductSalesPredictionDTO;
import com.woniuxy.service.IProductSalesPredictionService;
import com.woniuxy.util.PageResult;
import com.woniuxy.util.ResponseData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;

/**
 * @Author 陈华庆
 * @Date 2025/7/23 2:29
 * @Description TODO
 * 商品销售预测控制器
 * 提供商品销量预测和库存预警的API接口
 */
/*
- 1.
数据来源 ：

- 使用 order 表的 article_id （关联商品）、 create_time （下单时间）和 status （订单状态，仅统计已支付订单）
- 使用 all_shop 表的商品基本信息和价格
- 2.
预测算法 ：

- 采用时间序列平滑法，基于过去12周的历史销售数据
- 计算历史平均销量和标准差，预测未来4周销量
- 置信区间设置为平均值±标准差
- 3.
库存预警 ：

- 基于预测销量和当前库存（实际项目中需在 all_shop 表添加库存字段）
- 低库存预警：库存 < 预测销量 × 1.5
- 缺货预警：库存 < 预测销量 × 0.5
 */
@RestController
@RequestMapping("/product-sales-prediction")
public class ProductSalesPredictionController {

    @Autowired
    private IProductSalesPredictionService productSalesPredictionService;

    /**
     * 获取指定商品的销售预测
     * @param shopId 商品ID
     * @return 预测结果列表
     */
    @GetMapping("/shop/{shopId}")
    public ResponseData<List<ProductSalesPredictionDTO>> getShopSalesPrediction(@PathVariable("shopId") Integer shopId) {
        try {
            List<ProductSalesPredictionDTO> predictions = productSalesPredictionService.predictSalesByShopId(shopId);
            return ResponseData.ok(predictions);
        } catch (RuntimeException e) {
            // 使用ResponseData的fail方法替代error方法
            // 直接使用404状态码替代NOT_FOUND_CODE常量
            return ResponseData.fail(404, e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
            // 使用500状态码替代SYSTEM_ERROR_CODE常量
            return ResponseData.fail(500, "系统异常，请稍后重试");
        }
    }

    /**
     * 批量获取所有商品的销售预测和库存预警
     * @param pageNum 当前页码
     * @param pageSize 每页数量
     * @return 分页的预测结果
     */
    @GetMapping("/batch")
    public ResponseData<PageResult<ProductSalesPredictionDTO>> batchGetSalesPrediction(
            @RequestParam(name = "pageNum",defaultValue = "1") Integer pageNum,
            @RequestParam(name = "pageSize",defaultValue = "10") Integer pageSize) {
        try {
            PageResult<ProductSalesPredictionDTO> pageResult =
                    productSalesPredictionService.batchPredictSalesAndStockWarning(pageNum, pageSize);
            return ResponseData.ok(pageResult);
        } catch (Exception e) {
            e.printStackTrace();
            // 使用500状态码替代SYSTEM_ERROR_CODE常量
            return ResponseData.fail(500, "系统异常，请稍后重试");
        }
    }
}